﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Waiter.Common;
using Waiter.Controler;
using DevComponents.DotNetBar.Controls;
using DevComponents.DotNetBar;

namespace Waiter.View
{
    public partial class frmSalaryCalc : DevComponents.DotNetBar.Office2007Form//Form
    {
        SalaryCtrl mySalaryCtrl = new SalaryCtrl();
        StaffCtrl myStaffCtrl = new StaffCtrl();
        public delegate void CloseForm();                       //Delegate close form
        public CloseForm myCloseForm;                           //Tạo thể hiện của delegate

        public frmSalaryCalc()
        {
            InitializeComponent();
        }

        #region Events ************************************************

        /// <summary>
        /// Load form
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmSalaryCalc_Load(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmSalaryCalc.frmSalaryCalc_Load", "", "");
            //Load thông tin mặc định tại các control
            //Cotrol đầu hoặc cuối tháng
            cmbFirstOrEnd.SelectedIndex = 0;

            //Control tháng tính lương
            dateTimeCalc.Value = DateTime.Now;

            //ComboBox nhân viên
            myStaffCtrl.fsLoadComboBox_ListStaff(cmbStaff);
            try
            {
                //Đề phòng trường hợp ko có data nên try-catch
                cmbStaff.SelectedIndex = 0;
            }
            catch (Exception)
            { }

            //Cho chạy processbar
            prbCalculing.PerformStep();
        }

        /// <summary>
        /// Check/bỏ check tại chkStaff
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void chkStaff_CheckedChanged(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmSalaryCalc.chkStaff_CheckedChanged", "", "");
            if (chkStaff.Checked == true)//Nếu có gắn check
            {
                cmbStaff.Enabled = true;//Cho sử dụng cmbStaff
            }
            else//Nếu không gắn check
            {
                cmbStaff.Enabled = false;//Không cho sử dụng cmbStaff
            }
        }

        /// <summary>
        /// Ấn buton btnCalc
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCalc_Click(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmSalaryCalc.btnCalc_Click", "", "");
            //Kiểm tra error
            if (fsCheckErrorBeforeCalc() == false)
                return;

            if (MessageBoxEx.Show("Bạn đã kiểm tra thông tin chấm công của (các) nhân viên rồi chưa?", CommonMessages.MSG_CONFIRM_TITLE, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
            {
                string strResult = string.Empty;
                bool bIsFirst;
                if (cmbFirstOrEnd.SelectedItem.ToString() == cmbItemStart.Text)
                    bIsFirst = true;
                else
                    bIsFirst = false;

                fsControlEnableItem(false);//Không cho sử dụng các control để đề phòng lỗi khi đang tính

                if (chkStaff.Checked == true)//Tính lương từng nhân viên
                    strResult = mySalaryCtrl.fsCalcSalary(bIsFirst, dateTimeCalc.Value, cmbStaff.SelectedValue.ToString(), CommonUtils.fsGetOPID(), DateTime.Now);
                else//Tính lương tất cả nhân viên
                    strResult = mySalaryCtrl.fsCalcSalary(bIsFirst, dateTimeCalc.Value, string.Empty, CommonUtils.fsGetOPID(), DateTime.Now);

                fsControlEnableItem(true);//Cho sử dụng lại các control
                MessageBoxEx.Show(strResult, CommonMessages.MSG_NOTICE_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        /// <summary>
        /// Ấn button delete
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDelete_Click(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmSalaryCalc.btnDelete_Click", "", "");
            if (fsCheckErrorBeforeCalc() == false)
                return;

            if (MessageBoxEx.Show("Bạn chắc chắn muốn xóa thông tin lương của (các) nhân viên?", CommonMessages.MSG_CONFIRM_TITLE, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
            {
                string strResult = string.Empty;
                bool bIsFirst;
                if (cmbFirstOrEnd.SelectedText == cmbItemStart.Text)
                    bIsFirst = true;
                else
                    bIsFirst = false;

                fsControlEnableItem(false);

                if (chkStaff.Checked == true)//Tính lương từng nhân viên
                    strResult = mySalaryCtrl.fsDeleteSalary(bIsFirst, dateTimeCalc.Value, cmbStaff.SelectedValue.ToString());
                else
                    strResult = mySalaryCtrl.fsDeleteSalary(bIsFirst, dateTimeCalc.Value, string.Empty);

                fsControlEnableItem(true);
                MessageBoxEx.Show(strResult, CommonMessages.MSG_NOTICE_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        /// <summary>
        /// Khi đóng đang đóng
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmSalaryCalc_FormClosing(object sender, FormClosingEventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmSalaryCalc.frmSalaryCalc_FormClosing", "", "");
            if (myCloseForm != null)//Thông báo cho form menu
                myCloseForm();
        }

        #endregion

        #region Function ******************************************

        /// <summary>
        /// Ẩn hiện các item
        /// </summary>
        /// <param name="pStatus"></param>
        private void fsControlEnableItem(bool pStatus)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmSalaryCalc.fsControlEnableItem", "", "");
            dateTimeCalc.Enabled = pStatus;
            chkStaff.Enabled = pStatus;
            btnCalc.Enabled = pStatus;
            btnDelete.Enabled = pStatus;
            prbCalculing.Visible = pStatus;
            prbCalculing.Visible = !pStatus;//Ngược lại với các control khác
        }


        /// <summary>
        /// Kiểm tra error các control trước khi thực thi: tính lương/xóa lương
        /// </summary>
        /// <returns></returns>
        private bool fsCheckErrorBeforeCalc()
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmSalaryCalc.fsCheckErrorBeforeCalc", "", "");
            //Control dateTimeCalc phải được input
            if (dateTimeCalc.Value == DateTime.MinValue)
            {
                MessageBoxEx.Show("Bạn chưa nhập tháng/năm tính lương", CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.dateTimeCalc.Focus();
                return false;
            }

            //Nếu control chkStaff được check thì phải chọn trị tại cmbStaff
            if (chkStaff.Checked == true && cmbStaff.SelectedValue == null)
            {
                MessageBoxEx.Show("Bạn chưa chọn nhân viên cần tính lương", CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.cmbStaff.Focus();
                return false;
            }

            return true;
        }

        #endregion
    }
}